package GestionPlannification;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import outils.OutilsFichier;

/**
 * Classe représentant un pièce de théatre
 * @author Aude Legrand, Alexandre Becquet
 */
public class Piece{
    private int id;
	private String titre;
	private String resume;
    private String image;
	private Genre genre;
    /**
     * La durée de la pièce en heures
     */
    private int duree;
    /**
     * La liste des représentations de cette pièce
     */
    private List<Representation> representations;
    /**
     * La liste des auteurs de cette pièce
     */
	private List<Artiste> auteurs;
    /**
     * La liste des acteurs de cette pièce
     */
    private List<Artiste> acteurs;

    /**
     * Constructeur de la classe Pièce vide
     */
    public Piece() {
        this.representations=new ArrayList();
        this.acteurs=new ArrayList();
        this.auteurs=new ArrayList();
    }
    
    /**
     * Constructeur de la classe Piece avec id
     * @param id
     * @param titre
     * @param resume
     * @param genre
     * @param duree
     * @param image
     */
    public Piece(int id,String titre, String resume, Genre genre, int duree, String image){
        this.titre=titre;
        this.resume=resume;
        this.genre=genre;
        this.image=image;
        this.duree=duree;
        this.representations=new ArrayList();
        this.acteurs=new ArrayList();
        this.auteurs=new ArrayList();
        this.id=id;
    }

    /**
     * Constructeur de la classe Piece sans id
     * @param titre
     * @param resume
     * @param genre
     * @param duree
     * @param image
     */
    public Piece(String titre, String resume, Genre genre, int duree, String image){
        this.titre=titre;
        this.resume=resume;
        this.genre=genre;
        this.image=image;
        this.duree=duree;
        this.representations=new ArrayList();
        this.acteurs=new ArrayList();
        this.auteurs=new ArrayList();
    }

    /**
     * Retourne toutes les Pieces
     * @return la liste des pieces
     */
    public static List<Piece> findEntities() {
        List<Piece> lesPieces = null;
        try {
            lesPieces = PieceBD.realAllPiece();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return lesPieces;
    }

    /**
     * Recherche une piece grâce à son id
     * @param idPiece : L'id de la piece recherchée
     * @return la pièce recherchée
     */
    public static Piece findEntitie(int idPiece) {
        Piece p = null;
        try {
            p=PieceBD.readPiece(idPiece);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return p;
    }

    /**
     * Recherche de pieces grâce à un genre
     * @param genre
     * @return la liste de pieces trouvées
     */
    public static List<Piece> searchPiece(Genre genre) {
        //liste de toutes les pièces
        List<Piece> lesPieces=Piece.findEntities();
        //si il n'y pas de genre, renvoi toutes les pieces
        if(genre==null) return lesPieces;
        List<Piece> lesPiecesGenre=new ArrayList();
        for(int i=0;i<lesPieces.size();i++){
            if(lesPieces.get(i).genre.getIdGenre()==genre.getIdGenre()) {
                lesPiecesGenre.add(lesPieces.get(i));
            }
        }
        return lesPiecesGenre;
    }

    /**
     * Recherche de pieces grâce à une chaîne de caractère
     * Compare avec le titre de la pièce, les nom et prénoms des acteurs et auteurs
     * @param textRecherche
     * @return la liste de pieces trouvées
     */
    public static List<Piece> searchPiece(String textRecherche) {
        //mise en minuscule des caractères
        textRecherche=textRecherche.toLowerCase();
        //liste de toutes les pièces
        List<Piece> lesPieces =Piece.findEntities();
        List<Piece> lesPiecesRecherche=new ArrayList();
        for(int i=0;i<lesPieces.size();i++){
            //recherche par titre, auteurs et acteurs
            if(lesPieces.get(i).titre.toLowerCase().equals(textRecherche) ||
                    lesPieces.get(i).titre.toLowerCase().contains(textRecherche) ||
                    lesPieces.get(i).getActeursString().toLowerCase().contains(textRecherche) ||
                    lesPieces.get(i).getAuteursString().toLowerCase().contains(textRecherche) ){
                lesPiecesRecherche.add(lesPieces.get(i));
            }
        }
        return lesPiecesRecherche;

    }

    /**
     * Retourne les acteurs de la pièce
     * @return la liste des acteurs
     */
    public List getActeurs() {
        return this.acteurs;
    }

    /**
     * Retourne les auteurs de la pièce
     * @return la liste des auteurs
     */
    public List getAuteurs() {
        return this.auteurs;
    }

    /**
     * Retourne l'id de la pièce
     * @return l'id de la pièce
     */
    public int getId() {
        return this.id;
	}

    /**
     * Retourne la chaîne de caractère représentant les auteurs de la pièce
     * @return la chaîne de caractère représentant les auteurs de la pièce
     */
    public String getAuteursString() {
        String lesAuteurs = "";
        for(int i=0;i<this.acteurs.size();i++){
            lesAuteurs=lesAuteurs+this.auteurs.get(i).getPrenom()+" "+this.auteurs.get(i).getNom()+", ";
        }
         //suppresion de la dernière virgule
        if(lesAuteurs.length()>0) lesAuteurs=lesAuteurs.substring(0, (lesAuteurs.length()-2));
        return lesAuteurs;
    }

    /**
     * Retourne la chaîne de caractère représentant les representations de la pièce
     * @return la chaîne de caractère représentant les representations de la pièce
     */
    public String getRepresentationsString () {
        String representation = "";
        for(int i = 0; i < this.representations.size(); i++){
            representation = representation + this.representations.get(i).getDateRepresentation() + "; ";
        }
         //suppresion de la dernière virgule
        if(representation.length() > 0) representation = representation.substring(0, (representation.length()-2));
        return representation;
    }

    /**
     * Retourne la chaîne de caractère représentant les acteurs de la pièce
     * @return la chaîne de caractère représentant les acteurs de la pièce
     */
    public String getActeursString() {
        String lesActeurs = "";
        for(int i=0;i<this.acteurs.size();i++){
            lesActeurs=lesActeurs+this.acteurs.get(i).getPrenom()+" "+this.acteurs.get(i).getNom()+", ";
        }
        //suppresion de la dernière virgule
        if(lesActeurs.length()>0) lesActeurs=lesActeurs.substring(0, (lesActeurs.length()-2));
        return lesActeurs;   
	}

    /**
     * Ajouter un acteur à la pièce
     * @param unActeur : l'acteur à ajouter
     */
    public void addActeur(Artiste unActeur){
        this.acteurs.add(unActeur);
    }

    /**
     * Ajouter des acteurs à la pièce
     * @param lesActeurs : la liste des acteurs
     */
    public void addActeurs(List lesActeurs){
        this.acteurs=lesActeurs;
    }

    /**
     * Ajouter des auteurs à la pièce
     * @param lesAuteurs : la liste des auteurs
     */
    public void addAuteurs(List lesAuteurs){
        this.auteurs=lesAuteurs;
    }

    /**
     * Ajouter un auteur à la pièce
     * @param unAuteur : l'auteur à ajouter
     */
    public void addAuteur(Artiste unAuteur){
        this.auteurs.add(unAuteur);
    }

    /**
     * Ajouter une representation à la pièce
     * @param uneRepresentation la representation à ajouter
     */
    public void addRepresentation(Representation uneRepresentation){
        this.representations.add(uneRepresentation);
    }

    /**
     * Ajouter une representation à la pièce avec une date
     * @param date la date de la representation à ajouter
     */
    public void addRepresentation(Date date) {
        this.representations.add(new Representation(date,this));
    }

    /**
     * Retourne la liste des representations de la pièce
     * @return la liste des representations de la pièce
     */
    public List getRepresentations(){
        return this.representations;
    }

    /**
     * Retourne le genre de la pièce
     * @return le genre de la pièce
     */
	public Genre getGenre(){ 
            return this.genre;
	}

    /**
     * Retourne le résumé de la pièce
     * @return le résumé de la pièce
     */
    public String getResume(){
        return this.resume;
    }

    /**
     * Retourne le titre de la pièce
     * @return le titre de la pièce
     */
    public String getTitre(){
        return this.titre;
    }

    /**
     * Retourne la durée de la pièce en heures
     * @return la durée de la pièce
     */
    public int getDuree(){
        return this.duree;
    }

    /**
     * Savoir si les representations d'une pièce sont pleines
     * @return vrai si la pièce est pleine
     */
    public boolean isPlein() {
        for(int i=0;i<this.representations.size();i++){
            if(!this.representations.get(i).isPlein()) return false;
        }
        return true;
    }

    /**
     * Enlever les acteurs de la pièce
     */
    public void removeActeurs() {
        this.acteurs=new ArrayList();
    }

    /**
     * Enlever les auteurs de la pièce
     */
    public void removeAuteurs() {
        this.auteurs=new ArrayList();
    }

    /**
     * Enlever les representations de la pièce
     */
    public void removeRepresentations() {
        this.representations=new ArrayList();
    }

    /**
     * Mise à jour de l'id de la piece
     * @param id
     */
    public void setId(int id) {
        this.id=id;
    }

    /**
     * Mise à jour de la duree de la piece
     * @param duree
     */
    public void setDuree(int duree) {
        this.duree=duree;
    }

    /**
     * Mise à jour du genre de la piece
     * @param genre
     */
    public void setGenre(Genre genre) {
        this.genre=genre;
    }

    /**
     * Mise à jour du resume de la piece
     * @param unResume
     */
    public void setResume(String unResume) {
        this.resume=unResume;
    }

    /**
     * Mise à jour du titre de la piece
     * @param unTitre
     */
    public void setTitre(String unTitre) {
        this.titre=unTitre;
    }

    /**
     *Crée une piece et transferer son image
     * @param unePiece la pièce à enregistrer
     * @param pathAffiche l'url de l'affiche
     */
    public static void create(Piece unePiece,String pathAffiche){
        try {            
            unePiece.setId(PieceBD.savePiece(unePiece));
            OutilsFichier.copieFichier(pathAffiche,"image/"+unePiece.id+".JPG");
            PieceBD.saveActeurs(unePiece);
            PieceBD.saveAuteurs(unePiece);
            PieceBD.saveRepresentations(unePiece);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Met à jour une pièce
     * @param unePiece la pièce à mettre à jour
     */
    public static void edit(Piece unePiece){
        try {
            PieceBD.updatePiece(unePiece);
            PieceBD.updateActeurs(unePiece);
            PieceBD.updateAuteurs(unePiece);
            PieceBD.updateRepresentations(unePiece);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Ajouter des representations à la pièce
     * @param desRepresentations : la liste des representations
     */
    public void addRepresentations(List<Representation> desRepresentations) {
        this.representations=desRepresentations;
    }

    /**
     * Retourne la chaîne de caractère représentant la Piece
     * @return la chaîne de caractère représentant le Piece
     */
    @Override
    public String toString(){
        return this.getTitre();
    }

    
}
